/**
 * 
 */
package com.monkeyboy.dubbo.service.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import org.apache.dubbo.config.annotation.Reference;
import org.apache.dubbo.rpc.cluster.Constants;
import org.springframework.stereotype.Service;

import com.monkeyboy.dubbo.api.IUserService;
import com.monkeyboy.dubbo.service.IOrderService;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;

/**
 * 
 *
 * @author Gavin<br>
 *         2019年12月27日
 */
@Service
public class OrderServiceImpl implements IOrderService {
	/**
	 * timeout:消费者超时时间<br>
	 * version:版本设置（用于灰度发布）<br>
	 * stub : "com.monkeyboy.dubbo.service.impl.SubUserServiceImpl"本地存根，相当于一个服务切面，用于自定义处理错误逻辑<br>
	 * cluster:集群的容错方案，默认为failover<br>
	 * retries:重试次数设默认为2，设为0配合cluster=failover就可以避免重试修改数据库<br>
	 * loadbalance: 负载均衡策略,默认随机</br>
	 */
	// @Reference(url="127.0.0.1:20800")绕过注册中心直接链接dubbo
	@Reference(timeout = 2000, version = "1.0.0", cluster = "failover",loadbalance= Constants.DEFAULT_LOADBALANCE) // dubbo超时设置,version指定调用的服务版本号（*代表随机调用，用于灰度发布服务）
	private IUserService iUserServiceImpl;

	/**
	 * @HystrixCommand：hystrix熔断处理，失败会调用testHystrix方法（和存根的作用类似）<br>
	 * note:fallbackMethod指定的方法参数必须要和调用的getAllUser()方法参数一致<br>
	 */
	@HystrixCommand(fallbackMethod = "testHystrix")
	public ArrayList<Map<String, Object>> getAllUser() throws Exception {
		return iUserServiceImpl.getAllUser();
	}

	public Map<String, Object> getUserByUserName(String name) throws Exception {
		return iUserServiceImpl.getUserByUserName(name);
	}

	/**
	 * hystrix在调用服务出错时候调用的方法
	 * 
	 * @Author Gavin</br>
	 *         2019年12月28日
	 */
	public ArrayList<Map<String, Object>> testHystrix() {
		ArrayList<Map<String, Object>> errRes = new ArrayList<Map<String, Object>>();
		Map<String, Object> r = new HashMap<String, Object>();
		r.put("ERROR_CODE", 500);
		r.put("ERROR_MSG", "hystrix服务降级测试成功。");
		errRes.add(r);
		return errRes;
	}
}
